// 例子5

function test() {
    console.log(a);
    console.log(foo());

    var a = 1;

    function foo() {
        return 2;
    }
}

test();

// 执行上下文变量对象创建和执行过程
// // 创建阶段
// testEC = {
//     VO: {
//         arguments: {...},
//         foo: <foo reference> , // 表示foo的地址引用
//         a: undefined
//     },
//     scopeChain: {...}
// }

// // 执行阶段 VO -> AO
// testEC = {
//     VO: {
//         arguments: {...},
//         foo: <foo reference> ,
//         a: 1
//     },
//     scopeChain: {...}
//     this: window
// }

console.log('##############################')

// 变化顺序后
function test() {
    function foo() {
        return 2;
    }

    var a;
    console.log(a);
    console.log(foo());
    a = 1;
}

test();